package com.insmess.speech.sdk.template;

import cn.hutool.core.util.RuntimeUtil;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.io.File;
import java.util.UUID;

@Component
@Slf4j
public class FfmpegTemplate {
    @Value("${ffmpeg.path}")
    private String ffmpegPath;

    private String ffmpegCmd;

    @PostConstruct
    public void init() {
        this.ffmpegCmd = ffmpegPath + File.separator + "bin" + File.separator +  "ffmpeg";
    }

    /**
     * 将音频格式转换为wav（如果原格式为wav，则直接返回路径）。
     * @param file 文件
     * @param sr 采样率
     * @return
     */
    @SneakyThrows
    public File formatWav(File file, Integer sr) {
        //如果是原有的wav格式，则直接返回
        if (endsWith(file, ".wav")) {
            return file;
        }
        //创建临时存放的目录
        File tmpDir = new File("./tmp/audio");
        if (!tmpDir.exists()) {
            tmpDir.mkdirs();
        }
        //创建临时文件File对象
        File tmpAudioFile = new File(tmpDir, "target_" + UUID.randomUUID().toString() + ".wav");
        String cmd = ffmpegCmd + " -i " + file.getAbsolutePath() + " -ar " + sr + " " + tmpAudioFile.getAbsolutePath();
        log.info("format cmd：{}", cmd);
        RuntimeUtil.execForStr(cmd);

        return tmpAudioFile;
    }

    public File formatWav(File file) {
        return formatWav(file, 16000);
    }

    private boolean endsWith(File file, String endStr) {
        return file.getName().toLowerCase().endsWith(endStr);
    }
}
